package business.services;

import java.util.List;
import java.util.Vector;
import common.Contexto;
import data.entities.PagoCancha;
import data.entities.ReservaCancha;
import data.repository.IRepository;
import data.repository.QueryParameter;
import data.repository.RepositoryException;
import business.interfaces.IPagoCancha;

public class ServicioPagos implements IServicioPagos {
	private IRepository<PagoCancha> repositorioPagos;
	private IServicioReservas servicioReservas;
	
	public ServicioPagos(IServicioReservas servicioReservas) {
		this.servicioReservas = servicioReservas;
	}
	
	public List<IPagoCancha> getPagos(Integer anio, Integer mes) throws ServiceException {
		try {
			String queryExpression = "from PagoCancha p where month(p.reserva.fecha) = :mes and year(p.reserva.fecha) = :anio";
			QueryParameter parameter1 = new QueryParameter("mes", mes);
			QueryParameter parameter2 = new QueryParameter("anio", anio);
			List<PagoCancha> pagos = this.repositorioPagos.getAll(queryExpression, parameter1, parameter2);
			
			return this.getPagos(pagos);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public void pagarReserva(String dni) throws ServiceException {
		ReservaCancha reserva = (ReservaCancha) this.servicioReservas.getReserva(dni);
		Double totalPago = Contexto.PrecioPorReserva;
		PagoCancha newPago = new PagoCancha();
		
		if(reserva.getSenia() >= 0) {
			totalPago -= reserva.getSenia();
		}
		
		newPago.setReserva(reserva);
		newPago.setTotalPago(totalPago);
		
		try {
			this.repositorioPagos.saveOrUpdate(newPago);	
			this.servicioReservas.cancelarReserva(dni);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}
	
	private List<IPagoCancha> getPagos(List<PagoCancha> pagos) {
		List<IPagoCancha> result = new Vector<IPagoCancha>();
		
		for(PagoCancha pago : pagos) {
			result.add(pago);
		}
		
		return result;
	}
}
